package com.qu.waibao.baidu;

import android.app.Application;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.qu.waibao.utils.LogUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @描述 describe
 * @作者 Administrator
 * @创建时间 2018/7/27 17:42
 * @邮箱 1123599561@qq.com
 */
public class LocationUtils {
    private static final String TAG = "LocationUtils";
    public static LocationClient mLocationClient;
    public static MyLocationListener mMyLocationListener;
    public static com.baidu.location.Address addressbean= null;
    public static double latitude= 0;
    public static BDLocation Mylocation= null;
    public static double longitude= 0;
    public static float radius = 100;  //范围一百米
    public static String time = "";
    public static PoiInfo poiinfo=null;
    private static LocationUtils locationUtils;
    public static LocationUtils getLocationUtils(){
        if(locationUtils == null){
            locationUtils = new LocationUtils();
        }
        return locationUtils;
    }
    public interface ILocateDelegate {
        public void onLocateSuccess( BDLocation location);

        public void onLocateFailed();
    }

    public static ArrayList<ILocateDelegate> locateDelegateArrayList = new ArrayList<ILocateDelegate>();



    public void init(Application application) {
        LogUtil.Logi("TAG","初始化");
        SDKInitializer.initialize(application);
        mLocationClient = new LocationClient(application.getApplicationContext());
        mMyLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(mMyLocationListener);
        initLocation();
    }

    public static void startLocation(){
        mLocationClient.start();
    }
    public static void stopLocation(){
        mLocationClient.stop();
    }
    /**
     * 实现实时位置回调监听
     */
    public  class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            if(mLocationClient.isStarted()){
                mLocationClient.stop();
            }
            if(location !=null){
                LogUtil.Logi(TAG,"location.getCity():"+location.getCity());
                LogUtil.Logi(TAG,"location.getDistrict():"+location.getDistrict());
                LogUtil.Logi(TAG,"location.getStreet():"+location.getStreet());
                LogUtil.Logi(TAG,"location.getAddrStr():"+location.getAddrStr());

            }
            Mylocation=location;
            poiinfo=new PoiInfo();
            poiinfo.location=new LatLng(Mylocation.getLatitude(),Mylocation.getLongitude());
            poiinfo.address=Mylocation.getAddrStr();
            poiinfo.name=Mylocation.getAddress().district+Mylocation.getAddress().street;
            poiinfo.city=Mylocation.getCity();
            StringBuffer sb = new StringBuffer(256);
            sb.append("time : ");
            time = location.getTime();
            sb.append(time);
            sb.append("\nerror code : ");
            sb.append(location.getLocType());
            sb.append("\nlatitude : ");
            latitude=location.getLatitude();
            longitude=location.getLongitude();

            com.baidu.location.Address address = location.getAddress();
            if(address !=null){
                LogUtil.Logi("street",""+address.street); //凤康路
                LogUtil.Logi("city",""+address.city); //广州市
                LogUtil.Logi("country",""+address.country);//中国
                LogUtil.Logi("district",""+address.district);//海珠区
                LogUtil.Logi("province",""+address.province);//广东省
            }

            sb.append(location.getLatitude());
            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());
            sb.append("\nradius : ");
            radius = location.getRadius();
            sb.append(radius);

            if(location.getLocType()==BDLocation.TypeGpsLocation||location.getLocType()==BDLocation.TypeNetWorkLocation||location.getLocType()==BDLocation.TypeOffLineLocation){
                for (int i = 0; i < locateDelegateArrayList.size(); i++) {
                    ILocateDelegate locateDelegate = locateDelegateArrayList.get(i);
                    LocationUtils.addressbean =location.getAddress();
                    locateDelegate.onLocateSuccess(location);
                }
            }
            if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());// 单位：公里每小时
                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());
                sb.append("\nheight : ");
                sb.append(location.getAltitude());// 单位：米
                sb.append("\ndirection : ");
                sb.append(location.getDirection());
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                sb.append("\ndescribe : ");
                sb.append("gps定位成功");
            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果
                sb.append("\naddr : ");

                sb.append(location.getAddrStr());
                //运营商信息
                sb.append("\noperationers : ");
                sb.append(location.getOperators());
                sb.append("\ndescribe : ");
                sb.append("网络定位成功");
            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                sb.append("\ndescribe : ");
                sb.append("离线定位成功，离线定位结果也是有效的");
            } else if (location.getLocType() == BDLocation.TypeServerError) {
                sb.append("\ndescribe : ");
                sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                sb.append("\ndescribe : ");
                sb.append("网络不同导致定位失败，请检查网络是否通畅");
            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                sb.append("\ndescribe : ");
                sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");

                for (int i = 0; i < locateDelegateArrayList.size(); i++) {
                    ILocateDelegate locateDelegate = locateDelegateArrayList.get(i);
                    locateDelegate.onLocateFailed();
                }
            }
            sb.append("\nlocationdescribe : ");// 位置语义化信息
            sb.append(location.getLocationDescribe());
            List<Poi> list = location.getPoiList();// POI信息
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for(int i= 0;i<list.size();i++){
                    if(i==0){

                    }
                    sb.append("\npoi= : ");
                    sb.append(list.get(i).getId() + " " + list.get(i).getName() + " " + list.get(i).getRank());
                }
            }
        }
    }
    private static void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系，
        int span=1000;//每次定位时间间隔
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIgnoreKillProcess(true);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        mLocationClient.setLocOption(option);
    }
}
